Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
В окне редактора исходного кода дополним код класса.
Теперь класс Data является JavaBeans-компонентом, представляющим данные приложения.
В окне Package Explorer щелкнем правой кнопкой мышки на узле класса Data и в контекстном меню выберем команду New | Other | WindowBuilder | SWT Designer | Databinding | JFace Automating Databinding и нажмем кнопку Next, в окне мастера выберем переключатель Shell и нажмем кнопку Next.
В поле Properties: выберем свойство data класса Data и нажмем кнопку Finish.
В результате будет создано окно Shell, включающее в себя текстовое поле, содержимое которого синхронизировано со свойством data класса Data.
Связывание данных данного SWT-приложения устанавливается с помощью создания объекта DataBindingContext, который отвечает за хранение информации обо всех связываниях данных приложения.
Связывание данных вносится в DataBindingContext-объект с помощью методов класса DataBindingContext:
Метод bindList – синхронизирует два списка java.util.List.
Метод bindSet – синхронизирует два набора java.util.Set.
Метод bindValue – синхронизирует два объекта.
В данном SWT-приложении применяется метод bindValue для синхронизации свойства Text-компонента со свойством JavaBeans-компонента.
При этом свойство Text-компонента и свойство JavaBeans-компонента обертываются в объекты IObservableValue, обеспечивающие отслеживание изменений значений свойств.
Обертывание свойства Text-компонента в IObservableValue-объект производится с помощью статического метода observeText класса-фабрики SWTObservables, а обертывание свойства JavaBeans-компонента – с помощью статического метода observeValue класса-фабрики PojoObservables.
В методе main данного SWT-приложения Shell-окно создается в специальном UI-потоке, для которого определен контекст доступа к IObservable-объектам, обеспечивающий уведомление IObservable-объектами своих слушателей.
Такой контекст представлен объектом Realm.
Для демонстрации связывания данных во вкладке Design WindowBuilder-редактора перенесем в Shell-окно элемент Button раздела Controls Palette-палитры и два раза щелкнем по нему мышкой – в результате будет сгенерирован код создания Button-компонента и присоединения к нему слушателя событий выбора компонента.
Дополним код обработчика событий компонента.
В выделенных строках кода изменяется значение свойства data объекта Data и вызывается метод, обновляющий DataBindingContext-контекст.
После запуска приложения выбором команды Run As | Java Application контекстного меню окна Package Explorer при нажатии кнопки окна приложения в текстовом поле появится значение свойства JavaBeans-компонента «Hello».
Для того чтобы в обработчике событий кнопки не обновлять DataBindingContext-контекст вызовом метода setData, изменим код класса Data и код метода initDataBindings.
Здесь мы добавляем слушателей свойства JavaBeans-компонента, и в его методе setData автоматически генерируем событие изменения значения свойства.
Здесь мы обертываем свойство JavaBeans-компонента.
Для создания связывания данных с помощью вкладки Bindings WindowBuilder-редактора во вкладке Design WindowBuilder-редактора перенесем в Shell-окно элемент Label раздела Controls Palette-палитры и перейдем на вкладку Bindings.
Во вкладке Bindings в поле Target выберем Label-компонент, в поле Properties – его свойство text. В поле Model кнопкой Widgets переключимся на компоненты и выберем Text-компонент, а в нижнем поле Properties – его свойство text и нажмем кнопку создания связывания.
В окне мастера Create Data Binding нажмем кнопку OK.
В результате метод initDataBindings дополнится кодом.
Здесь текст поля связывается с текстом Label-компонента.
Убедимся, что вызов метода initDataBindings производится после создания Label-компонента, и во вкладке Design WindowBuilder-редактора в области визуального редактирования нажмем на Label-компоненте правой кнопкой мышки и в контекстном меню выберем команду Horizontal alignment | Fill, гарантируя отображение текста метки.
Теперь после запуска приложения изменение текста в текстовом поле приведет к автоматическому изменению текста метки.
JFace-приложения
Для создания JFace-приложения
в окне Package Explorer нажмем правой кнопкой мышки на узле проекта, созданного с использованием мастера SWT/JFace Java Project, и в контекстном меню выберем команду New | Other | WindowBuilder | SWT Designer | JFace | ApplicationWindow, нажмем кнопку Next, введем имя пакета и имя класса и нажмем кнопку Finish.
В результате будет создан главный класс JFace-приложения, представляющий окно с заголовком и кнопками «свернуть», «развернуть» и «закрыть», расширяющий класс ApplicationWindow и имеющий публичный конструктор, статический метод main, внутренний метод createActions и переопределенные методы createContents, createMenuManager, createToolBarManager, createStatusLineManager, configureShell и getInitialSize.
В конструкторе главного класса JFace-приложения вызывается конструктор класса ApplicationWindow с аргументом Shell null, где Shell – это родительское окно для данного окна, таким образом определяя создаваемое окно главным окном приложения.
Далее вызываются методы createActions, addToolBar, addMenuBar и addStatusLine.
Метод createActions предназначен для создания JFace-действий, а методы addToolBar, addMenuBar и addStatusLine являются методами класса ApplicationWindow и отвечают за определение конфигурации окна, имеющего панель инструментов, панель меню и строку статуса.
Метод createContents переопределяет соответствующий метод класса Window, являющегося суперклассом класса ApplicationWindow.
Данный метод отвечает за создание и возврат содержимого окна, и в переопределенном методе createContents создается и возвращается SWT контейнер Composite.
При добавлении компонентов в ApplicationWindow-окно приложения, используя область визуального редактирования вкладки Design WindowBuilder-редактора, код создания компонентов добавляется в метод createContents и компоненты становятся дочерними компонентами возвращаемого методом Composite-контейнера.
Метод createMenuManager переопределяет соответствующий метод класса ApplicationWindow.
Данный метод отвечает за создание и возврат объекта MenuManager – объекта-помощника, упрощающего создание и обновление меню.
Заполнить меню элементами можно используя раздел JFace Actions Palette-палитры вкладки Design WindowBuilder-редактора, который появляется в Palette-палитре при создании JFace-приложения.
Для добавления элемента меню перенесем элемент New раздела JFace Actions Palette-палитры в область (Empty MenuManager) холста дизайнера.
В результате в методе createActions появится код создания экземпляра анонимного класса, расширяющего класс Action, а в методе createMenuManager произойдет добавление созданного Action-объекта в панель меню методом add интерфейса IContributionManager, который реализуется классом MenuManager и который обеспечивает общий протокол для добавления, удаления и поиска элементов панели меню, панели инструментов и строки статуса.
После добавления, Action-объект отображается в виде кнопки панели меню.
Для того чтобы нажатие добавленной кнопки панели меню вызвало требуемое действие необходимо переопределить метод run класса Action, вызываемый средой выполнения при возникновении SWT-события.
Метод createToolBarManager переопределяет соответствующий метод класса ApplicationWindow.
Данный метод отвечает за создание и возврат объекта ToolBarManager – объекта-помощника, упрощающего создание и обновление панели инструментов.
Заполнить панель инструментов элементами можно, используя раздел JFace Actions Palette-палитры вкладки Design WindowBuilder-редактора.
Для добавления элемента панели инструментов перенесем элемент New раздела JFace Actions Palette-палитры в область (Empty ToolBarManager) холста